Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

androidApp/src/google/kotlin/org/meshtastic/app/map/MapViewModel.kt renovate/fastlane-2.x-lockfile (056eed64) Text, 40.75 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.app.map

Tff7b72import T7ee787android.app.Application
Tff7b72import T7ee787android.net.Uri
Tff7b72import T7ee787androidx.core.net.toFile
Tff7b72import T7ee787androidx.lifecycle.SavedStateHandle
Tff7b72import T7ee787androidx.lifecycle.viewModelScope
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787com.google.android.gms.maps.model.CameraPosition
Tff7b72import T7ee787com.google.android.gms.maps.model.LatLng
Tff7b72import T7ee787com.google.android.gms.maps.model.LatLngBounds
Tff7b72import T7ee787com.google.android.gms.maps.model.TileProvider
Tff7b72import T7ee787com.google.maps.android.compose.CameraPositionState
Tff7b72import T7ee787com.google.maps.android.compose.MapType
Tff7b72import T7ee787kotlinx.coroutines.CancellationException
Tff7b72import T7ee787kotlinx.coroutines.Job
Tff7b72import T7ee787kotlinx.coroutines.cancelAndJoin
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableSharedFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.combine
Tff7b72import T7ee787kotlinx.coroutines.flow.first
Tff7b72import T7ee787kotlinx.coroutines.flow.flowOn
Tff7b72import T7ee787kotlinx.coroutines.flow.update
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787kotlinx.coroutines.withContext
Tff7b72import T7ee787okio.FileSystem
Tff7b72import T7ee787okio.Path.Companion.toPath
Tff7b72import T7ee787org.koin.core.annotation.KoinViewModel
Tff7b72import T7ee787org.meshtastic.app.map.offline.pmtiles.OfflineDownloadState
Tff7b72import T7ee787org.meshtastic.app.map.offline.pmtiles.OfflineRegion
Tff7b72import T7ee787org.meshtastic.app.map.offline.pmtiles.OfflineRegionExtractor
Tff7b72import T7ee787org.meshtastic.app.map.offline.pmtiles.OfflineRegionStore
Tff7b72import T7ee787org.meshtastic.app.map.offline.pmtiles.OfflineRegionTileSet
Tff7b72import T7ee787org.meshtastic.app.map.offline.terrain.TerrainDownloadPlanner
Tff7b72import T7ee787org.meshtastic.app.map.prefs.map.GoogleCameraPosition
Tff7b72import T7ee787org.meshtastic.app.map.prefs.map.GoogleMapSelectionPrefs
Tff7b72import T7ee787org.meshtastic.app.map.prefs.map.GoogleMapsPrefs
Tff7b72import T7ee787org.meshtastic.app.map.tiles.MapTileHttpClient
Tff7b72import T7ee787org.meshtastic.app.map.tiles.RasterBasemap
Tff7b72import T7ee787org.meshtastic.app.map.tiles.RasterTileProvider
Tff7b72import T7ee787org.meshtastic.app.map.tiles.toRasterBasemap
Tff7b72import T7ee787org.meshtastic.core.common.util.LocaleUnitsProvider
Tff7b72import T7ee787org.meshtastic.core.di.CoroutineDispatchers
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.model.NodeAddress
Tff7b72import T7ee787org.meshtastic.core.network.repository.NetworkRepository
Tff7b72import T7ee787org.meshtastic.core.repository.MapPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.MapTileProviderPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.core.repository.NotificationPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.PacketRepository
Tff7b72import T7ee787org.meshtastic.core.repository.RadioConfigRepository
Tff7b72import T7ee787org.meshtastic.core.repository.RadioController
Tff7b72import T7ee787org.meshtastic.core.repository.UiPrefs
Tff7b72import T7ee787org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed
Tff7b72import T7ee787org.meshtastic.feature.map.BaseMapViewModel
Tff7b72import T7ee787org.meshtastic.feature.map.layers.LayerOpacityStore
Tff7b72import T7ee787org.meshtastic.feature.map.layers.MapLayerItem
Tff7b72import T7ee787org.meshtastic.feature.map.layers.MapLayersManager
Tff7b72import T7ee787org.meshtastic.feature.map.layers.PickedMapFile
Tff7b72import T7ee787org.meshtastic.feature.map.shouldAutoUseOfflineBasemap
Tff7b72import T7ee787org.meshtastic.feature.map.terrain.GeoBounds
Tff7b72import T7ee787org.meshtastic.feature.map.terrain.TerrainDownloadState
Tff7b72import T7ee787org.meshtastic.feature.map.terrain.TerrainRegionExtractor
Tff7b72import T7ee787org.meshtastic.feature.map.terrain.TerrainTileStore
Tff7b72import T7ee787org.meshtastic.feature.map.tiles.CustomTileProviderConfig
Tff7b72import T7ee787org.meshtastic.feature.map.tiles.CustomTileProviderRepository
Tff7b72import T7ee787org.meshtastic.feature.map.tiles.CustomTileProviderSaveResult
Tff7b72import T7ee787org.meshtastic.feature.map.tiles.MapTileCatalogue
Tff7b72import T7ee787org.meshtastic.feature.map.tiles.RasterOverlaySource
Tff7b72import T7ee787org.meshtastic.feature.map.tiles.RasterTileSpec
Tff7b72import T7ee787org.meshtastic.feature.map.tiles.isValidTileUrlTemplate
Tff7b72import T7ee787java.io.File
Tff7b72import T7ee787java.io.FileOutputStream
Tff7b72import T7ee787java.io.IOException
Tff7b72import T7ee787kotlin.uuid.Uuid

T8b949e/** Waypoint coordinates arrive as integer degrees scaled by 1e7. */
Tff7b72private Tff7b72const Tff7b72val Te6edf3WAYPOINT_COORD_SCALE Tff7b72= T79c0ff1Te6edf3e7

T8b949e/** Camera zoom applied when centering on a selected waypoint. */
Tff7b72private Tff7b72const Tff7b72val Te6edf3WAYPOINT_FOCUS_ZOOM Tff7b72= T79c0ff1T79c0ff5f

Tff7b72enum Tff7b72class T56d364CameraInitialization Tb4b4b4{
Te6edf3LoadingTb4b4b4,
Te6edf3FitNodesTb4b4b4,
Te6edf3RestoredTb4b4b4,
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tf0883e@KoinViewModel
Tff7b72class T56d364MapViewModelTb4b4b4(
Tff7b72private Tff7b72val Te6edf3applicationTb4b4b4: Te6edf3ApplicationTb4b4b4,
Tff7b72private Tff7b72val Te6edf3dispatchersTb4b4b4: Te6edf3CoroutineDispatchersTb4b4b4,
Tff7b72private Tff7b72val Te6edf3mapLayersManagerTb4b4b4: Te6edf3MapLayersManagerTb4b4b4,
Tff7b72private Tff7b72val Te6edf3layerOpacityStoreTb4b4b4: Te6edf3LayerOpacityStoreTb4b4b4,
Te6edf3mapPrefsTb4b4b4: Te6edf3MapPrefsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3googleMapsPrefsTb4b4b4: Te6edf3GoogleMapsPrefsTb4b4b4,
Te6edf3nodeRepositoryTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepositoryTb4b4b4,
Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepositoryTb4b4b4,
Te6edf3radioControllerTb4b4b4: Te6edf3RadioControllerTb4b4b4,
Tff7b72private Tff7b72val Te6edf3customTileProviderRepositoryTb4b4b4: Te6edf3CustomTileProviderRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3mapTileProviderPrefsTb4b4b4: Te6edf3MapTileProviderPrefsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3mapTileHttpClientTb4b4b4: Te6edf3MapTileHttpClientTb4b4b4,
Te6edf3uiPrefsTb4b4b4: Te6edf3UiPrefsTb4b4b4,
Te6edf3notificationPrefsTb4b4b4: Te6edf3NotificationPrefsTb4b4b4,
Te6edf3savedStateHandleTb4b4b4: Te6edf3SavedStateHandleTb4b4b4,
Te6edf3localeUnitsProviderTb4b4b4: Te6edf3LocaleUnitsProviderTb4b4b4,
Te6edf3networkRepositoryTb4b4b4: Te6edf3NetworkRepositoryTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3BaseMapViewModelTb4b4b4(
Te6edf3mapPrefsTb4b4b4,
Te6edf3nodeRepositoryTb4b4b4,
Te6edf3packetRepositoryTb4b4b4,
Te6edf3radioControllerTb4b4b4,
Te6edf3radioConfigRepositoryTb4b4b4,
Te6edf3notificationPrefsTb4b4b4,
Te6edf3localeUnitsProviderTb4b4b4,
Te6edf3networkRepositoryTb4b4b4,
Tb4b4b4) Tb4b4b4{

Tff7b72private Tff7b72val Te6edf3_selectedWaypointId Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3savedStateHandleTb4b4b4.Te6edf3getTff7b72<Tffa657IntTff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffwaypointIdTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3selectedWaypointIdTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657Int?Tff7b72> Tff7b72= Te6edf3_selectedWaypointIdTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

T8b949e// Injected by the map provider because this SavedStateHandle is not the Navigation 3 entry's route state.
Tff7b72private Tff7b72val Te6edf3sitePlannerRequestState Tff7b72= Te6edf3SitePlannerRequestStateTb4b4b4(Te6edf3nodeRepositoryTb4b4b4.Te6edf3nodeDBbyNumTb4b4b4)
Tff7b72val Te6edf3sitePlannerRequestTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3Node?Tff7b72> Tff7b72=
Te6edf3sitePlannerRequestStateTb4b4b4.Te6edf3requestTb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Tff7b72nullTb4b4b4)

Tff7b72fun Td2a8ffsetSitePlannerNodeNumTb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657Int?Tb4b4b4) Tb4b4b4{
Te6edf3sitePlannerRequestStateTb4b4b4.Te6edf3setNodeNumTb4b4b4(Te6edf3nodeNumTb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8ffconsumeSitePlannerRequestTb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Te6edf3sitePlannerRequestStateTb4b4b4.Te6edf3consumeTb4b4b4(Te6edf3nodeNumTb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8ffsetWaypointIdTb4b4b4(Te6edf3idTb4b4b4: Tffa657Int?Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_selectedWaypointIdTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3_selectedWaypointIdTb4b4b4.Te6edf3value Tff7b72= Te6edf3id
Tff7b72if Tb4b4b4(Te6edf3id Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3wpMap Tff7b72= Te6edf3waypointsTb4b4b4.Te6edf3first Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3containsKeyTb4b4b4(Te6edf3idTb4b4b4) Tb4b4b4}
Te6edf3wpMapTff7b72[Te6edf3idTff7b72]Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72>
Tff7b72val Te6edf3waypoint Tff7b72= Te6edf3packetTb4b4b4.Te6edf3waypointTff7b72!!
Tff7b72val Te6edf3latLng Tff7b72=
Te6edf3LatLngTb4b4b4(
Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3latitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ Te6edf3WAYPOINT_COORD_SCALETb4b4b4,
Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3longitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ Te6edf3WAYPOINT_COORD_SCALETb4b4b4,
Tb4b4b4)
Te6edf3cameraPositionStateTb4b4b4.Te6edf3position Tff7b72= Te6edf3CameraPositionTb4b4b4.Te6edf3fromLatLngZoomTb4b4b4(Te6edf3latLngTb4b4b4, Te6edf3WAYPOINT_FOCUS_ZOOMTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3cameraPositionState Tff7b72= Te6edf3CameraPositionStateTb4b4b4(Te6edf3CameraPositionTb4b4b4.Te6edf3fromLatLngZoomTb4b4b4(Te6edf3LatLngTb4b4b4(T79c0ff0.0Tb4b4b4, T79c0ff0.0Tb4b4b4)Tb4b4b4, T79c0ff7fTb4b4b4)Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_cameraInitialization Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3CameraInitializationTb4b4b4.Te6edf3LoadingTb4b4b4)
Tff7b72val Te6edf3cameraInitializationTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3CameraInitializationTff7b72> Tff7b72= Te6edf3_cameraInitializationTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3themeTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657IntTff7b72> Tff7b72= Te6edf3uiPrefsTb4b4b4.Te6edf3theme

Tff7b72private Tff7b72val Te6edf3_errorFlow Tff7b72= Te6edf3MutableSharedFlowTff7b72<Tffa657StringTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3errorFlowTb4b4b4: Te6edf3FlowTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3_errorFlowTb4b4b4.Te6edf3asFlowTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3customTileProviderConfigsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3CustomTileProviderConfigTff7b72>Tff7b72> Tff7b72=
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProvidersTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_selectedRasterBasemapId Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)

T8b949e/** The chosen raster basemap: a [MapTileCatalogue] source, or one of the user's own. Null means Google's own. */
Tff7b72val Te6edf3selectedRasterBasemapIdTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3selectedRasterBasemapTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3RasterBasemap?Tff7b72> Tff7b72=
Te6edf3combineTb4b4b4(Te6edf3_selectedRasterBasemapIdTb4b4b4, Te6edf3customTileProviderConfigsTb4b4b4) Tb4b4b4{ Te6edf3selectedIdTb4b4b4, Te6edf3providers Tff7b72-Tff7b72>
Te6edf3selectedIdTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3id Tff7b72-Tff7b72>
Te6edf3MapTileCatalogueTb4b4b4.Te6edf3basemapsTb4b4b4.Te6edf3firstOrNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3id Tb4b4b4}Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3RasterBasemapTb4b4b4.Te6edf3RemoteTb4b4b4(Te6edf3idTb4b4b4, Tffa657itTb4b4b4.Te6edf3specTb4b4b4) Tb4b4b4}
Tff7b72?: Te6edf3providersTb4b4b4.Te6edf3findSelectedCustomTileProviderTb4b4b4(Te6edf3idTb4b4b4)Tff7b72?.Te6edf3toRasterBasemapTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Tff7b72nullTb4b4b4)

T8b949e/**
* The overlays this map can composite over its basemap.
*
* DEM sources are dropped: their pixels encode elevation for a renderer that shades them into terrain, and drawing
* the raw values over the map would just be noise. The MapLibre map, which does shade them, offers the full set.
*/
Tff7b72val Te6edf3availableOverlaysTb4b4b4: Te6edf3ListTff7b72<Te6edf3RasterOverlaySourceTff7b72> Tff7b72= Te6edf3MapTileCatalogueTb4b4b4.Te6edf3overlaysTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3demEncoding Tff7b72=Tff7b72= Tff7b72null Tb4b4b4}

Tff7b72private Tff7b72val Te6edf3_enabledOverlayIds Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3SetTff7b72<Tffa657StringTff7b72>Tff7b72>Tb4b4b4(Te6edf3emptySetTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3enabledOverlayIdsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3SetTff7b72<Tffa657StringTff7b72>Tff7b72> Tff7b72= Te6edf3_enabledOverlayIdsTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

T8b949e/** Per-layer opacity, shared with the MapLibre map through [LayerOpacityStore]. */
Tff7b72val Te6edf3layerOpacityTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Tffa657FloatTff7b72>Tff7b72> Tff7b72= Te6edf3layerOpacityStoreTb4b4b4.Te6edf3opacity

Tff7b72fun Td2a8ffsetLayerOpacityTb4b4b4(Te6edf3keyTb4b4b4: Tffa657StringTb4b4b4, Te6edf3opacityTb4b4b4: Tffa657FloatTb4b4b4) Tff7b72= Te6edf3layerOpacityStoreTb4b4b4.Te6edf3setOpacityTb4b4b4(Te6edf3keyTb4b4b4, Te6edf3opacityTb4b4b4)

Tff7b72fun Td2a8fftoggleOverlayTb4b4b4(Te6edf3overlayIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3_enabledOverlayIdsTb4b4b4.Te6edf3update Tb4b4b4{ Te6edf3enabled Tff7b72-Tff7b72> Tff7b72if Tb4b4b4(Te6edf3overlayId Tff7b72in Te6edf3enabledTb4b4b4) Te6edf3enabled Tff7b72- Te6edf3overlayId Tff7b72else Te6edf3enabled Tff7b72+ Te6edf3overlayId Tb4b4b4}
Tb4b4b4}

T8b949e/**
* A tile provider for an overlay. The basemap goes through [getTileProvider], which keeps the archive it opened.
*/
Tff7b72fun Td2a8ffcreateTileProviderTb4b4b4(Te6edf3specTb4b4b4: Te6edf3RasterTileSpecTb4b4b4)Tb4b4b4: Te6edf3TileProvider Tff7b72= Te6edf3RasterTileProviderTb4b4b4(Te6edf3specTb4b4b4, Te6edf3mapTileHttpClientTb4b4b4.Te6edf3clientTb4b4b4)

Tff7b72private Tff7b72val Te6edf3_selectedGoogleMapType Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4)
Tff7b72val Te6edf3selectedGoogleMapTypeTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MapTypeTff7b72> Tff7b72= Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffaddCustomTileProviderTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3urlTemplateTb4b4b4: Tffa657StringTb4b4b4, Te6edf3localUriTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72if Tb4b4b4(
Te6edf3nameTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3urlTemplateTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3localUri Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3localUri Tff7b72=Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3urlTemplateTb4b4b4)Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffInvalid name, URL template, or local URI for custom tile provider.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tff7b72var Te6edf3finalLocalUri Tff7b72= Te6edf3localUri
Tff7b72if Tb4b4b4(Te6edf3localUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3localUriTb4b4b4)
Tff7b72val Te6edf3extension Tff7b72= Ta5d6ff"Ta5d6ffmbtilesTa5d6ff"
Tff7b72val Te6edf3finalFileName Tff7b72= Ta5d6ff"Ta5d6ffmbtiles_Tffd700${Te6edf3UuidTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff.Tffd700$Te6edf3extensionTa5d6ff"
Tff7b72val Te6edf3copiedUri Tff7b72= Te6edf3copyFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3finalFileNameTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3copiedUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3finalLocalUri Tff7b72= Te6edf3copiedUriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffFailed to copy MBTiles file to internal storage.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3CancellationExceptionTb4b4b4) Tb4b4b4{
Tff7b72throw Te6edf3e T8b949e// A cancelled copy (ViewModel cleared) is not a processing failure.
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffError processing local URITa5d6ff" Tb4b4b4}
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffError processing local URI for MBTiles.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3newConfig Tff7b72= Te6edf3CustomTileProviderConfigTb4b4b4(Te6edf3name Tff7b72= Te6edf3nameTb4b4b4, Te6edf3urlTemplate Tff7b72= Te6edf3urlTemplateTb4b4b4, Te6edf3localUri Tff7b72= Te6edf3finalLocalUriTb4b4b4)
Tff7b72when Tb4b4b4(Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3addCustomTileProviderTb4b4b4(Te6edf3newConfigTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3CustomTileProviderSaveResultTb4b4b4.Te6edf3SAVED Tff7b72-Tff7b72> Tffa657Unit

Te6edf3CustomTileProviderSaveResultTb4b4b4.Te6edf3DUPLICATE_NAME Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3finalLocalUriTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3deleteFileToInternalStorageTb4b4b4(Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Tffa657itTb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffCustom tile provider with name 'Tffd700$Te6edf3nameTa5d6ff' already exists.Ta5d6ff"Tb4b4b4)
Tb4b4b4}

Te6edf3CustomTileProviderSaveResultTb4b4b4.Te6edf3NOT_FOUND Tff7b72-Tff7b72> Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffFailed to save custom tile provider.Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffaddCustomTileProviderTb4b4b4(Te6edf3configTb4b4b4: Te6edf3CustomTileProviderConfigTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3normalized Tff7b72= Te6edf3configTb4b4b4.Te6edf3normalizedTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Tff7b72!Te6edf3normalizedTb4b4b4.Te6edf3hasValidGoogleTileSourceTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffInvalid custom tile provider configuration.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tff7b72when Tb4b4b4(Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3addCustomTileProviderTb4b4b4(Te6edf3normalizedTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3CustomTileProviderSaveResultTb4b4b4.Te6edf3SAVED Tff7b72-Tff7b72> Tffa657Unit

Te6edf3CustomTileProviderSaveResultTb4b4b4.Te6edf3DUPLICATE_NAME Tff7b72-Tff7b72>
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffCustom tile provider with that name already exists.Ta5d6ff"Tb4b4b4)

Te6edf3CustomTileProviderSaveResultTb4b4b4.Te6edf3NOT_FOUND Tff7b72-Tff7b72> Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffFailed to save custom tile provider.Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffupdateCustomTileProviderTb4b4b4(Te6edf3configToUpdateTb4b4b4: Te6edf3CustomTileProviderConfigTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3normalized Tff7b72= Te6edf3configToUpdateTb4b4b4.Te6edf3normalizedTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(
Te6edf3normalizedTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3urlTemplateTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3normalizedTb4b4b4.Te6edf3localUri Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3localUri Tff7b72=Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3urlTemplateTb4b4b4)Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffInvalid name, URL template, or local URI for updating custom tile provider.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tff7b72when Tb4b4b4(Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3updateCustomTileProviderTb4b4b4(Te6edf3normalizedTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3CustomTileProviderSaveResultTb4b4b4.Te6edf3SAVED Tff7b72-Tff7b72> Tffa657Unit

Te6edf3CustomTileProviderSaveResultTb4b4b4.Te6edf3DUPLICATE_NAME Tff7b72-Tff7b72>
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffAnother custom tile provider with name 'Tffd700${Te6edf3normalizedTb4b4b4.Te6edf3nameTffd700}Ta5d6ff' already exists.Ta5d6ff"Tb4b4b4)

Te6edf3CustomTileProviderSaveResultTb4b4b4.Te6edf3NOT_FOUND Tff7b72-Tff7b72> Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffCustom tile provider no longer exists.Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffremoveCustomTileProviderTb4b4b4(Te6edf3configIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3configToRemove Tff7b72= Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProviderByIdTb4b4b4(Te6edf3configIdTb4b4b4)
Tff7b72val Te6edf3wasSelected Tff7b72= Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3configId
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3deleteCustomTileProviderTb4b4b4(Te6edf3configIdTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3configToRemove Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3wasSelectedTb4b4b4) Tb4b4b4{
Te6edf3clearCurrentTileProviderTb4b4b4(Tb4b4b4)
Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL
Te6edf3mapTileProviderPrefsTb4b4b4.Te6edf3setSelectedCustomTileProviderIdTb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4.Te6edf3nameTb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3configToRemoveTb4b4b4.Te6edf3localUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3configToRemoveTb4b4b4.Te6edf3localUriTb4b4b4)
Te6edf3deleteFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffselectCustomTileProviderTb4b4b4(Te6edf3configTb4b4b4: Te6edf3CustomTileProviderConfig?Tb4b4b4) Tb4b4b4{
Te6edf3offlineAutoSwitch Tff7b72= Tff7b72null T8b949e// The user is choosing a basemap directly; stop tracking an auto-switch to restore.
Tff7b72if Tb4b4b4(Te6edf3config Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3configTb4b4b4.Te6edf3isLocal Tff7b72&Tff7b72& Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3configTb4b4b4.Te6edf3urlTemplateTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3wTb4b4b4(Ta5d6ff"Ta5d6ffAttempted to select an invalid custom tile URL templateTa5d6ff"Tb4b4b4)
Te6edf3clearCurrentTileProviderTb4b4b4(Tb4b4b4)
Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3mapTileProviderPrefsTb4b4b4.Te6edf3setSelectedCustomTileProviderIdTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4.Te6edf3nameTb4b4b4)
Tff7b72return
Tb4b4b4}
Te6edf3applyRasterBasemapSelectionTb4b4b4(Te6edf3configTb4b4b4.Te6edf3idTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3clearCurrentTileProviderTb4b4b4(Tb4b4b4)
Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3mapTileProviderPrefsTb4b4b4.Te6edf3setSelectedCustomTileProviderIdTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4.Te6edf3nameTb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/** Selects one of the raster basemaps we ship. They draw exactly as a user's own source does. */
Tff7b72fun Td2a8ffselectCatalogueBasemapTb4b4b4(Te6edf3basemapIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3offlineAutoSwitch Tff7b72= Tff7b72null T8b949e// The user is choosing a basemap directly; stop tracking an auto-switch to restore.
Te6edf3applyRasterBasemapSelectionTb4b4b4(Te6edf3basemapIdTb4b4b4)
Tb4b4b4}

T8b949e/**
* Points the map at a raster source and turns Google's own basemap off.
*
* `MapType.NONE` matters: leaving it on would have Google fetch and draw a basemap underneath tiles that are
* already opaque — paid quota spent on pixels nobody sees.
*/
Tff7b72private Tff7b72fun Td2a8ffapplyRasterBasemapSelectionTb4b4b4(Te6edf3basemapIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3value Tff7b72= Te6edf3basemapId
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NONE
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3mapTileProviderPrefsTb4b4b4.Te6edf3setSelectedCustomTileProviderIdTb4b4b4(Te6edf3basemapIdTb4b4b4) Tb4b4b4}
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8ffsetSelectedGoogleMapTypeTb4b4b4(Te6edf3mapTypeTb4b4b4: Te6edf3MapTypeTb4b4b4) Tb4b4b4{
Te6edf3offlineAutoSwitch Tff7b72= Tff7b72null T8b949e// The user is choosing a basemap directly; stop tracking an auto-switch to restore.
Te6edf3clearCurrentTileProviderTb4b4b4(Tb4b4b4)
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3mapType
Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3mapTileProviderPrefsTb4b4b4.Te6edf3setSelectedCustomTileProviderIdTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Te6edf3mapTypeTb4b4b4.Te6edf3nameTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72var Te6edf3currentTileProviderTb4b4b4: Te6edf3TileProvider? Tff7b72= Tff7b72null
Tff7b72private Tff7b72var Te6edf3currentTileProviderBasemapTb4b4b4: Te6edf3RasterBasemap? Tff7b72= Tff7b72null

T8b949e/**
* The tile provider drawing [basemap], reused while the selection holds.
*
* Kept rather than rebuilt because a local archive owns an open database handle, and because rebuilding a remote
* provider would drop the tiles it has already fetched.
*/
Tff7b72fun Td2a8ffgetTileProviderTb4b4b4(Te6edf3basemapTb4b4b4: Te6edf3RasterBasemap?Tb4b4b4)Tb4b4b4: Te6edf3TileProvider? Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3basemap Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3clearCurrentTileProviderTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72null
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3currentTileProvider Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3currentTileProviderBasemap Tff7b72=Tff7b72= Te6edf3basemapTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3currentTileProvider
Tb4b4b4}

Te6edf3clearCurrentTileProviderTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3newProvider Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3basemapTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3RasterBasemapTb4b4b4.Te6edf3Local Tff7b72-Tff7b72> Te6edf3openLocalArchiveTb4b4b4(Te6edf3basemapTb4b4b4.Te6edf3uriTb4b4b4)
Tff7b72is Te6edf3RasterBasemapTb4b4b4.Te6edf3Remote Tff7b72-Tff7b72> Te6edf3RasterTileProviderTb4b4b4(Te6edf3basemapTb4b4b4.Te6edf3specTb4b4b4, Te6edf3mapTileHttpClientTb4b4b4.Te6edf3clientTb4b4b4)
Tb4b4b4}

Te6edf3currentTileProvider Tff7b72= Te6edf3newProvider
Te6edf3currentTileProviderBasemap Tff7b72= Te6edf3basemapTb4b4b4.Te6edf3takeIf Tb4b4b4{ Te6edf3newProvider Tff7b72!Tff7b72= Tff7b72null Tb4b4b4}
Tff7b72return Te6edf3newProvider
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffopenLocalArchiveTb4b4b4(Te6edf3localUriTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3MBTilesProvider? Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3localUriTb4b4b4)
Tff7b72val Te6edf3file Tff7b72=
Tff7b72try Tb4b4b4{
Te6edf3uriTb4b4b4.Te6edf3toFileTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IllegalArgumentExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3wTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffFalling back to the raw path for a local MBTiles archiveTa5d6ff" Tb4b4b4}
Te6edf3FileTb4b4b4(Te6edf3uriTb4b4b4.Te6edf3path Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72return Tff7b72if Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MBTilesProviderTb4b4b4(Te6edf3fileTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3wTb4b4b4(Ta5d6ff"Ta5d6ffSelected local MBTiles file does not existTa5d6ff"Tb4b4b4)
Tff7b72null
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffisValidTileUrlTemplateTb4b4b4(Te6edf3urlTemplateTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72=
Te6edf3urlTemplateTb4b4b4.Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3requireHttps Tff7b72= Tff7b72falseTb4b4b4)

T8b949e/** What to restore once the network returns from an auto-switch; null when nothing has been auto-switched. */
Tff7b72private Tff7b72data Tff7b72class T56d364OfflineAutoSwitchStateTb4b4b4(Tff7b72val Te6edf3rasterBasemapIdTb4b4b4: Tffa657String?Tb4b4b4, Tff7b72val Te6edf3googleMapTypeTb4b4b4: Te6edf3MapTypeTb4b4b4)

Tff7b72private Tff7b72var Te6edf3offlineAutoSwitchTb4b4b4: Te6edf3OfflineAutoSwitchState? Tff7b72= Tff7b72null

T8b949e/**
* Google's own tiles have no offline continuity of their own — no downloaded packs, no ambient cache the app
* controls — so unlike the MapLibre flavor (whose engine keeps serving downloaded/cached tiles for the current
* style without any app-level help) this flavor has to switch basemaps itself to keep the map usable offline.
*
* Switches to the user's first local MBTiles source the instant the network drops, and switches back to whatever
* was selected before once it returns — but only if nothing else changed the selection in between; see the
* `offlineAutoSwitch = null` lines in [selectCustomTileProvider], [selectCatalogueBasemap] and
* [setSelectedGoogleMapType].
*/
Tff7b72private Tff7b72fun Td2a8ffhandleConnectivityChangeTb4b4b4(Te6edf3networkAvailableTb4b4b4: Tffa657BooleanTb4b4b4, Te6edf3providersTb4b4b4: Te6edf3ListTff7b72<Te6edf3CustomTileProviderConfigTff7b72>Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3networkAvailableTb4b4b4) Tb4b4b4{
Te6edf3restoreFromOfflineAutoSwitchTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3autoSwitchToOfflineBasemapTb4b4b4(Te6edf3providersTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffautoSwitchToOfflineBasemapTb4b4b4(Te6edf3providersTb4b4b4: Te6edf3ListTff7b72<Te6edf3CustomTileProviderConfigTff7b72>Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3alreadyLocal Tff7b72= Te6edf3providersTb4b4b4.Te6edf3findSelectedCustomTileProviderTb4b4b4(Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3valueTb4b4b4)Tff7b72?.Te6edf3isLocal Tff7b72=Tff7b72= Tff7b72true
Tff7b72val Te6edf3fallback Tff7b72= Te6edf3providersTb4b4b4.Te6edf3firstOrNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isLocal Tb4b4b4}
Tff7b72val Te6edf3shouldSwitch Tff7b72=
Te6edf3offlineAutoSwitch Tff7b72=Tff7b72= Tff7b72null Tff7b72&Tff7b72&
Tff7b72!Te6edf3alreadyLocal Tff7b72&Tff7b72&
Te6edf3shouldAutoUseOfflineBasemapTb4b4b4(Te6edf3networkAvailable Tff7b72= Tff7b72falseTb4b4b4, Te6edf3hasOfflineBasemap Tff7b72= Te6edf3fallback Tff7b72!Tff7b72= Tff7b72nullTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3shouldSwitch Tff7b72&Tff7b72& Te6edf3fallback Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3offlineAutoSwitch Tff7b72= Te6edf3OfflineAutoSwitchStateTb4b4b4(Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3valueTb4b4b4, Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3valueTb4b4b4)
Te6edf3applyRasterBasemapSelectionTb4b4b4(Te6edf3fallbackTb4b4b4.Te6edf3idTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffrestoreFromOfflineAutoSwitchTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3saved Tff7b72= Te6edf3offlineAutoSwitch Tff7b72?: Tff7b72return
Te6edf3offlineAutoSwitch Tff7b72= Tff7b72null
T8b949e// The saved id might no longer resolve — e.g. the user deleted that custom tile provider while offline —
T8b949e// in which case applying it anyway would leave selectedRasterBasemap null with Google's own basemap also
T8b949e// off (MapType.NONE), so the map would show nothing at all. Fall back to the native basemap instead.
Tff7b72val Te6edf3savedIdStillResolves Tff7b72=
Te6edf3savedTb4b4b4.Te6edf3rasterBasemapId Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72&
Tb4b4b4(
Te6edf3MapTileCatalogueTb4b4b4.Te6edf3basemapsTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3savedTb4b4b4.Te6edf3rasterBasemapId Tb4b4b4} Tff7b72|Tff7b72|
Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3findSelectedCustomTileProviderTb4b4b4(Te6edf3savedTb4b4b4.Te6edf3rasterBasemapIdTb4b4b4) Tff7b72!Tff7b72= Tff7b72null
Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3savedIdStillResolvesTb4b4b4) Tb4b4b4{
Te6edf3applyRasterBasemapSelectionTb4b4b4(Te6edf3checkNotNullTb4b4b4(Te6edf3savedTb4b4b4.Te6edf3rasterBasemapIdTb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3clearCurrentTileProviderTb4b4b4(Tb4b4b4)
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3savedTb4b4b4.Te6edf3googleMapType
Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3mapTileProviderPrefsTb4b4b4.Te6edf3setSelectedCustomTileProviderIdTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Te6edf3savedTb4b4b4.Te6edf3googleMapTypeTb4b4b4.Te6edf3nameTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffclearCurrentTileProviderTb4b4b4(Tb4b4b4) Tb4b4b4{
Tb4b4b4(Te6edf3currentTileProvider Tff7b72as? Te6edf3MBTilesProviderTb4b4b4)Tff7b72?.Te6edf3closeTb4b4b4(Tb4b4b4)
Te6edf3currentTileProvider Tff7b72= Tff7b72null
Te6edf3currentTileProviderBasemap Tff7b72= Tff7b72null
Tb4b4b4}

T8b949e/** Imported overlay layers; owned by the flavor-neutral [MapLayersManager] and rendered by [MapLayerOverlay]. */
Tff7b72val Te6edf3mapLayersTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3MapLayerItemTff7b72>Tff7b72> Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3mapLayers

T8b949e// --- Offline vector regions (PMTiles-extracted) ---

T8b949e// Offline properties exposed as internal StateFlow for composable consumption
Tff7b72internal Tff7b72val Te6edf3offlineRegionStore Tff7b72= Te6edf3OfflineRegionStoreTb4b4b4(Te6edf3FileTb4b4b4(Te6edf3applicationTb4b4b4.Te6edf3filesDirTb4b4b4, Ta5d6ff"Ta5d6ffoffline_regionsTa5d6ff"Tb4b4b4)Tb4b4b4)

T8b949e// A single shared instance, not one per download call: OfflineRegionExtractor's mutex only serializes concurrent
T8b949e// downloads against each other if they all go through the same instance.
Tff7b72private Tff7b72val Te6edf3offlineRegionExtractor Tff7b72= Te6edf3OfflineRegionExtractorTb4b4b4(Te6edf3offlineRegionStoreTb4b4b4)

Tff7b72private Tff7b72val Te6edf3_offlineRegions Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3offlineRegionStoreTb4b4b4.Te6edf3listTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3offlineRegionsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3OfflineRegionTff7b72>Tff7b72> Tff7b72= Te6edf3_offlineRegionsTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_offlineDownloadState Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3OfflineDownloadState?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3offlineDownloadStateTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3OfflineDownloadState?Tff7b72> Tff7b72= Te6edf3_offlineDownloadStateTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

T8b949e/**
* Shown on the map whenever a downloaded region covers the current viewport — manual, not tied to connectivity.
* Wiring this to `mapNetworkAvailable` (from the sibling offline-fallback change) so it activates itself the
* instant the network drops is the natural next step once both land; kept manual here so this change doesn't depend
* on that one merging first.
*/
Tff7b72private Tff7b72val Te6edf3_offlineOverlayEnabled Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Tff7b72val Te6edf3offlineOverlayEnabledTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3_offlineOverlayEnabledTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffsetOfflineOverlayEnabledTb4b4b4(Te6edf3enabledTb4b4b4: Tffa657BooleanTb4b4b4) Tb4b4b4{
Te6edf3_offlineOverlayEnabledTb4b4b4.Te6edf3value Tff7b72= Te6edf3enabled
Tb4b4b4}

Tff7b72fun Td2a8ffestimateOfflineTileCountTb4b4b4(Te6edf3boundsTb4b4b4: Te6edf3LatLngBoundsTb4b4b4, Te6edf3zoomRangeTb4b4b4: Te6edf3IntRangeTb4b4b4)Tb4b4b4: Tffa657Long Tff7b72=
Te6edf3OfflineRegionTileSetTb4b4b4.Te6edf3estimateTileCountTb4b4b4(Te6edf3boundsTb4b4b4, Te6edf3zoomRangeTb4b4b4)

Tff7b72fun Td2a8ffdownloadOfflineRegionTb4b4b4(Te6edf3boundsTb4b4b4: Te6edf3LatLngBoundsTb4b4b4, Te6edf3zoomRangeTb4b4b4: Te6edf3IntRangeTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3offlineRegionExtractorTb4b4b4.Te6edf3downloadTb4b4b4(Te6edf3boundsTb4b4b4, Te6edf3zoomRangeTb4b4b4)Tb4b4b4.Te6edf3collect Tb4b4b4{ Te6edf3state Tff7b72-Tff7b72>
Te6edf3_offlineDownloadStateTb4b4b4.Te6edf3value Tff7b72= Te6edf3state
Tff7b72if Tb4b4b4(Te6edf3state Tff7b72is Te6edf3OfflineDownloadStateTb4b4b4.Te6edf3CompleteTb4b4b4) Te6edf3_offlineRegionsTb4b4b4.Te6edf3value Tff7b72= Te6edf3offlineRegionStoreTb4b4b4.Te6edf3listTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffclearOfflineDownloadStateTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_offlineDownloadStateTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Tb4b4b4}

Tff7b72fun Td2a8ffdeleteOfflineRegionTb4b4b4(Te6edf3idTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_terrainDownloadRegionIdTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3idTb4b4b4) Tb4b4b4{
T8b949e// Joined, not just cancelled: the terrain job's Complete handler would otherwise re-add this region
T8b949e// to the manifest with no archive behind it, and its tile writes would race the directory delete.
Te6edf3terrainDownloadJobTff7b72?.Te6edf3cancelAndJoinTb4b4b4(Tb4b4b4)
Te6edf3clearTerrainDownloadStateTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3offlineRegionStoreTb4b4b4.Te6edf3deleteTb4b4b4(Te6edf3idTb4b4b4)
Te6edf3_offlineRegionsTb4b4b4.Te6edf3value Tff7b72= Te6edf3offlineRegionStoreTb4b4b4.Te6edf3listTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffofflineRegionArchiveFileTb4b4b4(Te6edf3idTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3File Tff7b72= Te6edf3offlineRegionStoreTb4b4b4.Te6edf3archiveFileTb4b4b4(Te6edf3idTb4b4b4)

T8b949e/** The downloaded region, if any, whose bounds fully cover [bounds] — the current camera viewport. */
Tff7b72fun Td2a8ffofflineRegionCoveringTb4b4b4(Te6edf3boundsTb4b4b4: Te6edf3LatLngBoundsTb4b4b4)Tb4b4b4: Te6edf3OfflineRegion? Tff7b72= Te6edf3_offlineRegionsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3firstOrNull Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3boundsTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3boundsTb4b4b4.Te6edf3northeastTb4b4b4) Tff7b72&Tff7b72& Tffa657itTb4b4b4.Te6edf3boundsTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3boundsTb4b4b4.Te6edf3southwestTb4b4b4)
Tb4b4b4}

T8b949e// --- Offline terrain (hillshade + contours), attached to an already-downloaded base region ---

Tff7b72private Tff7b72val Te6edf3_terrainDownloadState Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3TerrainDownloadState?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3terrainDownloadStateTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3TerrainDownloadState?Tff7b72> Tff7b72= Te6edf3_terrainDownloadStateTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

T8b949e/** Which region [terrainDownloadState] belongs to — terrain, unlike the base layer, downloads per-row. */
Tff7b72private Tff7b72val Te6edf3_terrainDownloadRegionId Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3terrainDownloadRegionIdTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3_terrainDownloadRegionIdTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

T8b949e/**
* Manual toggles, same shape as [offlineOverlayEnabled] — independent of it, gated by [OfflineRegion.hasTerrain].
*/
Tff7b72private Tff7b72val Te6edf3_terrainHillshadeEnabled Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Tff7b72val Te6edf3terrainHillshadeEnabledTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3_terrainHillshadeEnabledTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_terrainContoursEnabled Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Tff7b72val Te6edf3terrainContoursEnabledTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3_terrainContoursEnabledTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffsetTerrainHillshadeEnabledTb4b4b4(Te6edf3enabledTb4b4b4: Tffa657BooleanTb4b4b4) Tb4b4b4{
Te6edf3_terrainHillshadeEnabledTb4b4b4.Te6edf3value Tff7b72= Te6edf3enabled
Tb4b4b4}

Tff7b72fun Td2a8ffsetTerrainContoursEnabledTb4b4b4(Te6edf3enabledTb4b4b4: Tffa657BooleanTb4b4b4) Tb4b4b4{
Te6edf3_terrainContoursEnabledTb4b4b4.Te6edf3value Tff7b72= Te6edf3enabled
Tb4b4b4}

Tff7b72fun Td2a8ffclearTerrainDownloadStateTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_terrainDownloadStateTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3_terrainDownloadRegionIdTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Tb4b4b4}

T8b949e/** A [TerrainTileStore] rooted at this region's own terrain subdirectory of [offlineRegionStore]'s base dir. */
Tff7b72fun Td2a8ffterrainStoreForRegionTb4b4b4(Te6edf3idTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3TerrainTileStore Tff7b72=
Te6edf3TerrainTileStoreTb4b4b4(Te6edf3FileSystemTb4b4b4.Te6edf3SYSTEMTb4b4b4, Te6edf3offlineRegionStoreTb4b4b4.Te6edf3terrainDirTb4b4b4(Te6edf3idTb4b4b4)Tb4b4b4.Te6edf3absolutePathTb4b4b4.Te6edf3toPathTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72private Tff7b72var Te6edf3terrainDownloadJobTb4b4b4: Te6edf3Job? Tff7b72= Tff7b72null

T8b949e/**
* Downloads terrain for an already-downloaded base region. No-ops (rather than starting a download that would only
* fail) unless [canDownloadTerrainForRegion] — the UI already keeps its "Download Terrain" affordance disabled in
* that case; this is the defensive re-check, same relationship [downloadOfflineRegion] has to its own button's
* `enabled` condition. One terrain job at a time: a second would race the single [terrainDownloadState] and both
* would pass the same one-shot storage check.
*/
Tff7b72fun Td2a8ffdownloadTerrainForRegionTb4b4b4(Te6edf3regionIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3region Tff7b72= Te6edf3_offlineRegionsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3firstOrNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3regionId Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3region Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3terrainDownloadJobTff7b72?.Te6edf3isActive Tff7b72=Tff7b72= Tff7b72true Tff7b72|Tff7b72| Tff7b72!Te6edf3canDownloadTerrainForRegionTb4b4b4(Te6edf3regionIdTb4b4b4)Tb4b4b4) Tff7b72return

Te6edf3_terrainDownloadRegionIdTb4b4b4.Te6edf3value Tff7b72= Te6edf3regionId
Te6edf3_terrainDownloadStateTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3terrainDownloadJob Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3store Tff7b72= Te6edf3terrainStoreForRegionTb4b4b4(Te6edf3regionIdTb4b4b4)
Tff7b72val Te6edf3bounds Tff7b72=
Te6edf3GeoBoundsTb4b4b4(
Te6edf3south Tff7b72= Te6edf3regionTb4b4b4.Te6edf3southLatTb4b4b4,
Te6edf3west Tff7b72= Te6edf3regionTb4b4b4.Te6edf3westLonTb4b4b4,
Te6edf3north Tff7b72= Te6edf3regionTb4b4b4.Te6edf3northLatTb4b4b4,
Te6edf3east Tff7b72= Te6edf3regionTb4b4b4.Te6edf3eastLonTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3maxZoom Tff7b72= Te6edf3TerrainDownloadPlannerTb4b4b4.Te6edf3maxZoomFittingTb4b4b4(Te6edf3boundsTb4b4b4, Te6edf3TerrainRegionExtractorTb4b4b4.Te6edf3MAX_TILESTb4b4b4)
T8b949e// flowOn: the extractor does blocking per-tile HTTP on its collector's dispatcher.
Te6edf3TerrainRegionExtractorTb4b4b4(Te6edf3storeTb4b4b4)Tb4b4b4.Te6edf3downloadTb4b4b4(Te6edf3boundsTb4b4b4, Te6edf3maxZoomTb4b4b4)Tb4b4b4.Te6edf3flowOnTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4)Tb4b4b4.Te6edf3collect Tb4b4b4{ Te6edf3state Tff7b72-Tff7b72>
Te6edf3_terrainDownloadStateTb4b4b4.Te6edf3value Tff7b72= Te6edf3state
Tff7b72if Tb4b4b4(Te6edf3state Tff7b72is Te6edf3TerrainDownloadStateTb4b4b4.Te6edf3CompleteTb4b4b4) Te6edf3attachTerrainTb4b4b4(Te6edf3regionTb4b4b4, Te6edf3stateTb4b4b4, Te6edf3storeTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffattachTerrainTb4b4b4(
Te6edf3regionTb4b4b4: Te6edf3OfflineRegionTb4b4b4,
Te6edf3stateTb4b4b4: Te6edf3TerrainDownloadStateTb4b4b4.Te6edf3CompleteTb4b4b4,
Te6edf3storeTb4b4b4: Te6edf3TerrainTileStoreTb4b4b4,
Tb4b4b4) Tb4b4b4{
T8b949e// deleteOfflineRegion joins this job first, but the manifest is the authority on whether the region survived.
Tff7b72if Tb4b4b4(Te6edf3offlineRegionStoreTb4b4b4.Te6edf3listTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3none Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3regionTb4b4b4.Te6edf3id Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3storeTb4b4b4.Te6edf3deleteAllTb4b4b4(Tb4b4b4)
Tff7b72return
Tb4b4b4}
Te6edf3offlineRegionStoreTb4b4b4.Te6edf3addTb4b4b4(
Te6edf3regionTb4b4b4.Te6edf3copyTb4b4b4(
Te6edf3hasTerrain Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3terrainByteSize Tff7b72= Te6edf3stateTb4b4b4.Te6edf3byteSizeTb4b4b4,
Te6edf3terrainHasRegionalDetail Tff7b72= Te6edf3stateTb4b4b4.Te6edf3hasRegionalDetailTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3_offlineRegionsTb4b4b4.Te6edf3value Tff7b72= Te6edf3offlineRegionStoreTb4b4b4.Te6edf3listTb4b4b4(Tb4b4b4)
Tb4b4b4}

T8b949e/**
* Whether [regionId] is eligible for a terrain download: doesn't have one yet, and the shared storage budget
* ([OfflineRegionExtractor.MAX_TOTAL_BYTES], covering every region's base archive plus any terrain attached to it —
* [OfflineRegionStore.totalBytes]) isn't already exhausted.
*/
Tff7b72private Tff7b72fun Td2a8ffcanDownloadTerrainForRegionTb4b4b4(Te6edf3regionIdTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72val Te6edf3region Tff7b72= Te6edf3_offlineRegionsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3firstOrNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3regionId Tb4b4b4} Tff7b72?: Tff7b72return Tff7b72false
Tff7b72return Tff7b72!Te6edf3regionTb4b4b4.Te6edf3hasTerrain Tff7b72&Tff7b72& Te6edf3offlineRegionStoreTb4b4b4.Te6edf3totalBytesTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3OfflineRegionExtractorTb4b4b4.Te6edf3MAX_TOTAL_BYTES
Tb4b4b4}

Tff7b72init Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3savedCamera Tff7b72= Te6edf3googleMapsPrefsTb4b4b4.Te6edf3cameraPositionTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3savedCamera Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3_cameraInitializationTb4b4b4.Te6edf3value Tff7b72= Te6edf3CameraInitializationTb4b4b4.Te6edf3FitNodes
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3cameraPositionStateTb4b4b4.Te6edf3position Tff7b72= Te6edf3savedCameraTb4b4b4.Te6edf3toCameraPositionTb4b4b4(Tb4b4b4)
Te6edf3_cameraInitializationTb4b4b4.Te6edf3value Tff7b72= Te6edf3CameraInitializationTb4b4b4.Te6edf3Restored
Tb4b4b4}
Tb4b4b4}

Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3providerLoad Tff7b72= Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3awaitCustomTileProvidersTb4b4b4(Tb4b4b4)
Te6edf3loadPersistedMapTypeTb4b4b4(
Te6edf3providers Tff7b72= Te6edf3providerLoadTb4b4b4.Te6edf3providersTb4b4b4,
Te6edf3providerLoadSuccessful Tff7b72= Te6edf3providerLoadTb4b4b4.Te6edf3isSuccessfulTb4b4b4,
Te6edf3selection Tff7b72= Te6edf3googleMapsPrefsTb4b4b4.Te6edf3awaitMapSelectionTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3selectedProviderId Tff7b72= Te6edf3mapTileProviderPrefsTb4b4b4.Te6edf3awaitSelectedCustomTileProviderIdTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)

T8b949e// Sequenced after the persisted-selection load, in the same coroutine, deliberately: this collector can
T8b949e// otherwise start reacting to an offline-at-startup provider/network combination before the persisted
T8b949e// selection above has been applied, auto-switching against a still-default _selectedRasterBasemapId —
T8b949e// and loadPersistedMapType's own writes moments later would silently clobber that switch.
Te6edf3combineTb4b4b4(Te6edf3mapNetworkAvailableTb4b4b4, Te6edf3customTileProviderConfigsTb4b4b4, Tff7b72::Te6edf3PairTb4b4b4)Tb4b4b4.Te6edf3collect Tb4b4b4{ Tb4b4b4(Te6edf3availableTb4b4b4, Te6edf3providersTb4b4b4) Tff7b72-Tff7b72>
Te6edf3handleConnectivityChangeTb4b4b4(Te6edf3availableTb4b4b4, Te6edf3providersTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Te6edf3selectedWaypointIdTb4b4b4.Te6edf3valueTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3wpId Tff7b72-Tff7b72>
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3wpMap Tff7b72= Te6edf3waypointsTb4b4b4.Te6edf3first Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3containsKeyTb4b4b4(Te6edf3wpIdTb4b4b4) Tb4b4b4}
Te6edf3wpMapTff7b72[Te6edf3wpIdTff7b72]Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72>
Tff7b72val Te6edf3waypoint Tff7b72= Te6edf3packetTb4b4b4.Te6edf3waypointTff7b72!!
Tff7b72val Te6edf3latLng Tff7b72=
Te6edf3LatLngTb4b4b4(
Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3latitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ Te6edf3WAYPOINT_COORD_SCALETb4b4b4,
Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3longitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ Te6edf3WAYPOINT_COORD_SCALETb4b4b4,
Tb4b4b4)
Te6edf3cameraPositionStateTb4b4b4.Te6edf3position Tff7b72= Te6edf3CameraPositionTb4b4b4.Te6edf3fromLatLngZoomTb4b4b4(Te6edf3latLngTb4b4b4, Te6edf3WAYPOINT_FOCUS_ZOOMTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffsaveCameraPositionTb4b4b4(Te6edf3cameraPositionTb4b4b4: Te6edf3CameraPositionTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_cameraInitializationTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3CameraInitializationTb4b4b4.Te6edf3RestoredTb4b4b4) Tff7b72return
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setCameraPositionTb4b4b4(Te6edf3cameraPositionTb4b4b4.Te6edf3toMapCameraPositionTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8ffonInitialNodeBoundsAppliedTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_cameraInitializationTb4b4b4.Te6edf3value Tff7b72= Te6edf3CameraInitializationTb4b4b4.Te6edf3Restored
Te6edf3saveCameraPositionTb4b4b4(Te6edf3cameraPositionStateTb4b4b4.Te6edf3positionTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffloadPersistedMapTypeTb4b4b4(
Te6edf3providersTb4b4b4: Te6edf3ListTff7b72<Te6edf3CustomTileProviderConfigTff7b72>Tb4b4b4,
Te6edf3providerLoadSuccessfulTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3selectionTb4b4b4: Te6edf3GoogleMapSelectionPrefsTb4b4b4,
Te6edf3selectedProviderIdTb4b4b4: Tffa657String?Tb4b4b4,
Tb4b4b4) Tb4b4b4{
T8b949e// A catalogue source is not in the user's list, so it has to be recognised before that lookup decides the
T8b949e// stored id points at a source that no longer exists.
Tff7b72if Tb4b4b4(Te6edf3MapTileCatalogueTb4b4b4.Te6edf3basemapsTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3selectedProviderId Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3value Tff7b72= Te6edf3selectedProviderId
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NONE
Tff7b72return
Tb4b4b4}

Tff7b72val Te6edf3resolvedSelection Tff7b72=
Te6edf3providersTb4b4b4.Te6edf3resolvePersistedCustomTileSelectionTb4b4b4(
Te6edf3selectedProviderId Tff7b72= Te6edf3selectedProviderIdTb4b4b4,
Te6edf3legacySource Tff7b72= Te6edf3selectionTb4b4b4.Te6edf3customTileUrlTb4b4b4,
Te6edf3providerLoadSuccessful Tff7b72= Te6edf3providerLoadSuccessfulTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3selectedProvider Tff7b72= Te6edf3resolvedSelectionTb4b4b4.Te6edf3provider

Tff7b72if Tb4b4b4(Te6edf3selectedProvider Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3value Tff7b72= Te6edf3selectedProviderTb4b4b4.Te6edf3id
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NONE
Tff7b72if Tb4b4b4(Te6edf3selectedProviderId Tff7b72!Tff7b72= Te6edf3selectedProviderTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3mapTileProviderPrefsTb4b4b4.Te6edf3setSelectedCustomTileProviderIdTb4b4b4(Te6edf3selectedProviderTb4b4b4.Te6edf3idTb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3selectionTb4b4b4.Te6edf3customTileUrl Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_selectedRasterBasemapIdTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Tff7b72if Tb4b4b4(Te6edf3resolvedSelectionTb4b4b4.Te6edf3canDiscardMissingSelectionTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3selectedProviderId Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3mapTileProviderPrefsTb4b4b4.Te6edf3setSelectedCustomTileProviderIdTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3selectionTb4b4b4.Te6edf3customTileUrl Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3providerLoadSuccessful Tff7b72&Tff7b72& Tb4b4b4(Te6edf3selectedProviderId Tff7b72!Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3selectionTb4b4b4.Te6edf3customTileUrl Tff7b72!Tff7b72= Tff7b72nullTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL
Tff7b72return
Tb4b4b4}
Tff7b72try Tb4b4b4{
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3valueOfTb4b4b4(Te6edf3selectionTb4b4b4.Te6edf3mapTypeTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3_Tb4b4b4: Te6edf3IllegalArgumentExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3w Tb4b4b4{ Ta5d6ff"Ta5d6ffIgnoring an invalid saved Google Map typeTa5d6ff" Tb4b4b4}
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffaddMapLayerTb4b4b4(Te6edf3pickedTb4b4b4: Te6edf3PickedMapFileTb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3addMapLayerTb4b4b4(Te6edf3pickedTb4b4b4)

Tff7b72fun Td2a8ffaddNetworkMapLayerTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3urlTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3mapLayersManagerTb4b4b4.Te6edf3addNetworkMapLayerTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3urlTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3error Tff7b72-Tff7b72>
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffcopyFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3Uri? Tff7b72= Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3inputStream Tff7b72= Te6edf3applicationTb4b4b4.Te6edf3contentResolverTb4b4b4.Te6edf3openInputStreamTb4b4b4(Te6edf3uriTb4b4b4)
Tff7b72val Te6edf3directory Tff7b72= Te6edf3FileTb4b4b4(Te6edf3applicationTb4b4b4.Te6edf3filesDirTb4b4b4, Ta5d6ff"Ta5d6ffmap_layersTa5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3directoryTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3directoryTb4b4b4.Te6edf3mkdirsTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3outputFile Tff7b72= Te6edf3FileTb4b4b4(Te6edf3directoryTb4b4b4, Te6edf3fileNameTb4b4b4)
Tff7b72val Te6edf3outputStream Tff7b72= Te6edf3FileOutputStreamTb4b4b4(Te6edf3outputFileTb4b4b4)

Te6edf3inputStreamTff7b72?.Te6edf3use Tb4b4b4{ Te6edf3input Tff7b72-Tff7b72> Te6edf3outputStreamTb4b4b4.Te6edf3use Tb4b4b4{ Te6edf3output Tff7b72-Tff7b72> Te6edf3inputTb4b4b4.Te6edf3copyToTb4b4b4(Te6edf3outputTb4b4b4) Tb4b4b4} Tb4b4b4}
Te6edf3UriTb4b4b4.Te6edf3fromFileTb4b4b4(Te6edf3outputFileTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IOExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffError copying file to internal storageTa5d6ff" Tb4b4b4}
Tff7b72null
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffaddGeoJsonLayerTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3geoJsonTb4b4b4: Tffa657StringTb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3addGeoJsonLayerTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3geoJsonTb4b4b4)

Tff7b72fun Td2a8fftoggleLayerVisibilityTb4b4b4(Te6edf3layerIdTb4b4b4: Tffa657StringTb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3toggleLayerVisibilityTb4b4b4(Te6edf3layerIdTb4b4b4)

Tff7b72fun Td2a8ffremoveMapLayerTb4b4b4(Te6edf3layerIdTb4b4b4: Tffa657StringTb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3removeMapLayerTb4b4b4(Te6edf3layerIdTb4b4b4)

Tff7b72fun Td2a8ffrefreshMapLayerTb4b4b4(Te6edf3layerIdTb4b4b4: Tffa657StringTb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3refreshMapLayerTb4b4b4(Te6edf3layerIdTb4b4b4)

Tff7b72fun Td2a8ffrefreshAllVisibleNetworkLayersTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3refreshAllVisibleNetworkLayersTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffdeleteFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4) Tb4b4b4{
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3file Tff7b72= Te6edf3uriTb4b4b4.Te6edf3toFileTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3fileTb4b4b4.Te6edf3deleteTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffError deleting file from internal storageTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72suspend Tff7b72fun Td2a8ffreadLayerBytesTb4b4b4(Te6edf3layerItemTb4b4b4: Te6edf3MapLayerItemTb4b4b4)Tb4b4b4: Te6edf3ByteArray? Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3readLayerBytesTb4b4b4(Te6edf3layerItemTb4b4b4)

Tff7b72override Tff7b72fun Td2a8ffonClearedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onClearedTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3currentTileProvider Tff7b72as? Te6edf3MBTilesProviderTb4b4b4)Tff7b72?.Te6edf3closeTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffgetUserTb4b4b4(Te6edf3userIdTb4b4b4: Tffa657String?Tb4b4b4) Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3getUserTb4b4b4(Te6edf3userId Tff7b72?: Te6edf3NodeAddressTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4)
Tb4b4b4}

Tff7b72internal Tff7b72fun Td2a8ffListTff7b72<Te6edf3CustomTileProviderConfigTff7b72>Tb4b4b4.Te6edf3findSelectedCustomTileProviderTb4b4b4(
Te6edf3selectedProviderIdTb4b4b4: Tffa657String?Tb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3CustomTileProviderConfig? Tff7b72= Te6edf3singleOrNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3selectedProviderId Tb4b4b4}

Tff7b72internal Tff7b72fun Td2a8ffListTff7b72<Te6edf3CustomTileProviderConfigTff7b72>Tb4b4b4.Te6edf3findLegacyCustomTileProviderTb4b4b4(
Te6edf3legacySourceTb4b4b4: Tffa657String?Tb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3CustomTileProviderConfig? Tff7b72= Te6edf3legacySourceTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3source Tff7b72-Tff7b72> Te6edf3firstOrNull Tb4b4b4{ Tb4b4b4(Tffa657itTb4b4b4.Te6edf3localUri Tff7b72?: Tffa657itTb4b4b4.Te6edf3urlTemplateTb4b4b4) Tff7b72=Tff7b72= Te6edf3source Tb4b4b4} Tb4b4b4}

Tff7b72internal Tff7b72data Tff7b72class T56d364PersistedCustomTileSelectionTb4b4b4(
Tff7b72val Te6edf3providerTb4b4b4: Te6edf3CustomTileProviderConfig?Tb4b4b4,
Tff7b72val Te6edf3canDiscardMissingSelectionTb4b4b4: Tffa657BooleanTb4b4b4,
Tb4b4b4)

Tff7b72internal Tff7b72fun Td2a8ffListTff7b72<Te6edf3CustomTileProviderConfigTff7b72>Tb4b4b4.Te6edf3resolvePersistedCustomTileSelectionTb4b4b4(
Te6edf3selectedProviderIdTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3legacySourceTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3providerLoadSuccessfulTb4b4b4: Tffa657BooleanTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3PersistedCustomTileSelection Tb4b4b4{
Tff7b72val Te6edf3provider Tff7b72=
Te6edf3listOfNotNullTb4b4b4(Te6edf3findSelectedCustomTileProviderTb4b4b4(Te6edf3selectedProviderIdTb4b4b4)Tb4b4b4, Te6edf3findLegacyCustomTileProviderTb4b4b4(Te6edf3legacySourceTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3firstOrNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3hasValidGoogleTileSourceTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72return Te6edf3PersistedCustomTileSelectionTb4b4b4(
Te6edf3provider Tff7b72= Te6edf3providerTb4b4b4,
Te6edf3canDiscardMissingSelection Tff7b72= Te6edf3provider Tff7b72=Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3providerLoadSuccessfulTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72internal Tff7b72fun Te6edf3CustomTileProviderConfigTb4b4b4.Td2a8ffhasValidGoogleTileSourceTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72=
Te6edf3isLocal Tff7b72|Tff7b72| Te6edf3urlTemplateTb4b4b4.Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3requireHttps Tff7b72= Tff7b72falseTb4b4b4)

Tff7b72private Tff7b72fun Te6edf3GoogleCameraPositionTb4b4b4.Td2a8fftoCameraPositionTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3CameraPositionTb4b4b4(Te6edf3LatLngTb4b4b4(Te6edf3targetLatTb4b4b4, Te6edf3targetLngTb4b4b4)Tb4b4b4, Te6edf3zoomTb4b4b4, Te6edf3tiltTb4b4b4, Te6edf3bearingTb4b4b4)

Tff7b72private Tff7b72fun Te6edf3CameraPositionTb4b4b4.Td2a8fftoMapCameraPositionTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3GoogleCameraPositionTb4b4b4(
Te6edf3targetLat Tff7b72= Te6edf3targetTb4b4b4.Te6edf3latitudeTb4b4b4,
Te6edf3targetLng Tff7b72= Te6edf3targetTb4b4b4.Te6edf3longitudeTb4b4b4,
Te6edf3zoom Tff7b72= Te6edf3zoomTb4b4b4,
Te6edf3tilt Tff7b72= Te6edf3tiltTb4b4b4,
Te6edf3bearing Tff7b72= Te6edf3bearingTb4b4b4,
Tb4b4b4)

Served by rngit 1.5.2 - Generated in 0.16s